package com.yunke.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yunke.dto.user.YunkeUserProfileDto;
import com.yunke.entity.YunkeUser;
import com.yunke.vo.user.YunkeUserCenterVo;
import com.yunke.vo.user.YunkeUserInfoVo;
import com.yunke.vo.user.YunkeUserLoginVo;

/**
 * 用户Service接口
 * 
 * @author yunke
 * @since 1.0.0
 */
public interface YunkeUserService extends IService<YunkeUser> {

    /**
     * 发送短信验证码
     * 
     * @param phone 手机号
     * @param type 类型 1-注册 2-登录 3-找回密码
     * @return 操作结果
     */
    boolean sendSmsCode(String phone, Integer type);

    /**
     * 用户注册
     * 
     * @param phone 手机号
     * @param smsCode 短信验证码
     * @param password 密码（可选）
     * @param inviteCode 邀请码（可选）
     * @return 注册结果
     */
    boolean register(String phone, String smsCode, String password, String inviteCode);

    /**
     * 密码登录
     * 
     * @param username 用户名（手机号）
     * @param password 密码
     * @return 登录结果
     */
    YunkeUserLoginVo login(String username, String password);

    /**
     * 短信验证码登录
     * 
     * @param phone 手机号
     * @param smsCode 短信验证码
     * @return 登录结果
     */
    YunkeUserLoginVo smsLogin(String phone, String smsCode);

    /**
     * 微信登录
     * 
     * @param code 微信授权码
     * @param inviteCode 邀请码（可选）
     * @return 登录结果
     */
    String wechatLogin(String code, String inviteCode);

    /**
     * 用户退出登录
     * 
     * @return 操作结果
     */
    boolean logout();

    /**
     * 刷新Token
     * 
     * @return 新的Token
     */
    String refreshToken();

    /**
     * 忘记密码
     * 
     * @param phone 手机号
     * @param smsCode 短信验证码
     * @param newPassword 新密码
     * @return 操作结果
     */
    boolean forgetPassword(String phone, String smsCode, String newPassword);

    /**
     * 修改密码
     * 
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 操作结果
     */
    boolean changePassword(String oldPassword, String newPassword);

    /**
     * 绑定手机号
     * 
     * @param phone 手机号
     * @param smsCode 短信验证码
     * @return 操作结果
     */
    boolean bindPhone(String phone, String smsCode);

    /**
     * 解绑手机号
     * 
     * @param smsCode 短信验证码
     * @return 操作结果
     */
    boolean unbindPhone(String smsCode);

    /**
     * 根据手机号查询用户
     * 
     * @param phone 手机号
     * @return 用户信息
     */
    YunkeUser getUserByPhone(String phone);

    /**
     * 根据邀请码查询用户
     * 
     * @param inviteCode 邀请码
     * @return 用户信息
     */
    YunkeUser getUserByInviteCode(String inviteCode);

    /**
     * 生成邀请码
     * 
     * @return 邀请码
     */
    String generateInviteCode();

    /**
     * 检查用户是否存在
     * 
     * @param phone 手机号
     * @return 是否存在
     */
    boolean checkUserExists(String phone);

    /**
     * 更新用户最后登录信息
     * 
     * @param userId 用户ID
     * @param loginIp 登录IP
     */
    void updateLastLoginInfo(Long userId, String loginIp);

    /**
     * 获取当前用户信息
     * 
     * @return 用户信息VO
     */
    YunkeUserInfoVo getCurrentUserInfo();

    /**
     * 更新用户信息
     * 
     * @param userInfo 用户信息
     * @return 是否成功
     */
    boolean updateUserInfo(YunkeUserInfoVo userInfo);

    /**
     * 实名认证
     * 
     * @param realName 真实姓名
     * @param idCardNumber 身份证号
     * @param idCardFront 身份证正面照片
     * @param idCardBack 身份证背面照片
     * @return 认证结果
     */
    boolean realNameAuth(String realName, String idCardNumber, String idCardFront, String idCardBack);

    /**
     * 微信登录返回登录结果VO
     * 
     * @param code 微信授权码
     * @param inviteCode 邀请码（可选）
     * @return 登录结果
     */
    YunkeUserLoginVo wechatLoginWithResult(String code, String inviteCode);

    // ==================== 个人中心模块 ====================

    /**
     * 获取个人中心首页信息
     * 
     * @return 个人中心信息
     */
    YunkeUserCenterVo getUserCenter();

    /**
     * 获取用户详细信息
     * 
     * @param userId 用户ID（为空时查询当前用户）
     * @return 用户详细信息
     */
    YunkeUserInfoVo getUserProfile(Long userId);

    /**
     * 编辑个人信息
     * 
     * @param profileDto 个人信息DTO
     * @return 操作结果
     */
    boolean editProfile(YunkeUserProfileDto profileDto);

    /**
     * 关注/取消关注用户
     * 
     * @param followUserId 被关注用户ID
     * @return 操作结果（true-已关注，false-已取消关注）
     */
    boolean followUser(Long followUserId);

    /**
     * 获取关注列表
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @return 关注列表
     */
    Page<YunkeUserInfoVo> getFollowList(Long current, Long size);

    /**
     * 获取粉丝列表
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @return 粉丝列表
     */
    Page<YunkeUserInfoVo> getFansList(Long current, Long size);

    /**
     * 获取用户统计数据
     * 
     * @return 统计数据
     */
    YunkeUserCenterVo.StatisticsInfo getUserStatistics();

    /**
     * 获取邀请信息
     * 
     * @return 邀请信息
     */
    YunkeUserCenterVo.InviteInfo getInviteInfo();

    /**
     * 查看其他用户信息
     * 
     * @param userId 用户ID
     * @return 用户信息
     */
    YunkeUserInfoVo getOtherUserProfile(Long userId);

    /**
     * 系统设置
     * 
     * @param settingKey 设置项
     * @param settingValue 设置值
     * @return 操作结果
     */
    boolean updateSystemSettings(String settingKey, String settingValue);

    /**
     * 意见反馈
     * 
     * @param content 反馈内容
     * @param images 反馈图片
     * @param contact 联系方式
     * @return 操作结果
     */
    boolean submitFeedback(String content, String images, String contact);

    /**
     * 上传头像
     * 
     * @param avatarUrl 头像URL
     * @return 操作结果
     */
    boolean uploadAvatar(String avatarUrl);

    /**
     * 获取用户认证状态
     * 
     * @return 认证状态信息
     */
    Object getAuthStatus();

    /**
     * 获取收藏列表
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @param type 收藏类型
     * @return 收藏列表
     */
    Page<Object> getFavoriteList(Long current, Long size, Integer type);

    /**
     * 隐私设置
     * 
     * @param settingType 设置类型
     * @param settingValue 设置值
     * @return 操作结果
     */
    boolean updatePrivacySettings(String settingType, String settingValue);
} 